package VacationTest.PlaneFight.src;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.Vector;

public class GameFrame extends JFrame {
    //对英雄机和敌机作提前声明
    HeroPlane heroplane;
    EnemyPlane enemyPlane;
    // 定义子弹集合
    //Vector<bullet> bullets = new Vector<>();
    Vector<bullet> bullets =  bullet.getSingleton();
    //敌机集合
    Vector<EnemyPlane> enemys = new Vector<>();

    //GameFrame frame;
    private volatile static GameFrame frame;
    public static GameFrame getSingleton() {
        if (frame == null) {
            synchronized (GameFrame.class) {
                if (frame == null) {
                    frame = new GameFrame();
                }
            }
        }
        return frame;
    }
    public void Runnable(int choice)
    {
        if(choice ==1){
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    repaint();//不断重复画
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        } else if (choice==2) {
            new Thread(new Runnable() {
                Random r = new Random();
                @Override
                //重写run 方法
                public void run(){
                    while(true){
                        EnemyPlane enemyPlane = new EnemyPlane(r.nextInt(500), 0,frame);// 随机产生敌机，并创建敌机对象
                        enemyPlane.start(); // 启动线程
                        //随机产生敌机
                        enemys.add(enemyPlane); // 将 敌机对象 添加到 enemy 集合中
                        try{
                            Thread.sleep(500);
                        }catch(InterruptedException e){
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
    }
    private GameFrame() {

        frame = this ;// 后面 敌机的线程中要使用
        // 创建英雄机
        heroplane = new HeroPlane();
        //启动英雄机线程
        heroplane.start();
        // 设置窗体的宽高
        this.setSize(500, 760);
        this.setTitle("飞机大战");
        this.setResizable(false);//设置 用户是否可以调整窗口的大小   这里设置为 否
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);//设置窗口 相对于屏幕的位置，null 指：处于屏幕中央
        // 窗口可见
        this.setVisible(true);
        // 新建线程，让 画笔 不断 重复
        //画笔线程
        Runnable(1);
        /*new Thread(new Runnable() {//内部类
            @Override
            public void run() {
                while (true) {
                    repaint();//不断重复画
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();*/


        //产生敌机的线程
        Runnable(2);
//        new Thread(new Runnable(){
//            //产生随机数
//            Random r = new Random();
//            @Override
//            //重写run 方法
//            public void run(){
//                while(true){
//                    EnemyPlane enemyPlane = new EnemyPlane(r.nextInt(500), 0,frame);// 随机产生敌机，并创建敌机对象
//                    enemyPlane.start(); // 启动线程
//                    //随机产生敌机
//                    enemys.add(enemyPlane); // 将 敌机对象 添加到 enemy 集合中
//                    try{
//                        Thread.sleep(500);
//                    }catch(InterruptedException e){
//                        e.printStackTrace();
//                    }
//                }
//            }
//        }).start();
    }

    /**
     * 在窗口上画图片，需要不断重复的画，使用API中 paint 画笔 重写其中的方法
     *
     * @param g
     */
    public void paint(Graphics g) {
        //System.out.println("绘制画板");
        // 画背景
        BufferedImage image = (BufferedImage) this.createImage(this.getSize().width, this.getSize().height);
        // 高效缓存画笔
        Graphics pen = image.getGraphics();
        pen.drawImage(new ImageIcon("E:\\JavaCode\\AirWar\\src\\VacationTest\\PlaneFight\\Image\\Background.jpg").getImage(),0, 0, null);
        // 画英雄机
        pen.drawImage(heroplane.img, heroplane.x, heroplane.y, heroplane.width, heroplane.height, null);
        // 飞机发射子弹
        for (int i = 0; i < bullets.size(); i++) {
            //System.out.println("bullet");
            // 实例化 子弹对象  b
            bullet b = bullets.get(i);
            if (b.y > 0)
                pen.drawImage(b.img, b.x, b.y -= b.speed, b.width, b.height, null);
            else
                // 子弹超出上边界 移除
                bullets.remove(b);
        }
        //产生敌机
        for (int i = 0; i < enemys.size(); i++) {
            //实例化 敌机对象  ep
            EnemyPlane ep = enemys.get(i);

            if (ep.y < 760)
                pen.drawImage(ep.img, ep.x, ep.y += ep.speed, ep.width, ep.height, null);
            else
                enemys.remove(ep);
        }
        // 生效
        g.drawImage(image, 0, 0, null);
    }

    public static void main(String[] args) {
        //GameFrame frame = new GameFrame();
        GameFrame frame =  GameFrame.getSingleton();
        Player player = new Player(frame);
        //给 玩家注册事件监听器
        frame.addKeyListener(player);
    }
}

